package com.haierp.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.mapper.AutoMapper;
import com.haierp.model.ErpOrder;
import com.haierp.model.InventoryArea;
import com.haierp.model.ItemSku;
import com.haierp.vo.InventoryQueryVO;

/**
 * InventoryArea 数据控制层
 * 
 * @author liuhui
 *
 */
public interface InventoryAreaMapper extends AutoMapper<InventoryArea> {

	/**
	 * 根据唯一约束查询InventoryArea
	 * 
	 * @param itemId
	 *            商品ID ，后续分库分表可使用
	 * @param skuId
	 * @param warehouseId
	 * @param positionNo
	 * @return
	 */
	InventoryArea getInventoryArea(@Param("itemId") Long itemId, @Param("skuId") Long skuId,
			@Param("warehouseId") Long warehouseId, @Param("positionNo") String positionNo);

	/**
	 * 商品型号总库存
	 * 
	 * @param itemId
	 *            商品ID ，后续分库分表可使用
	 * @param skuId
	 *            唯一商品型号 类似skucode
	 * @return
	 */
	InventoryArea sumInventoryBySkuId(@Param("itemId") Long itemId, @Param("skuId") Long skuId);

	/**
	 * 计算分仓库总库存量
	 * 
	 * @param itemId
	 *            商品ID ，后续分库分表可使用
	 * @param skuId
	 *            唯一商品型号 类似skucode
	 * @return
	 */
	List<InventoryArea> sumInventoryBySkuIdGroupbyWarehouse(@Param("itemId") Long itemId, @Param("skuId") Long skuId,@Param("warehouseId") Long warehouseId);

	/**
	 * 某个仓库某个商品库存详情
	 * 
	 * @param warehouseId
	 * @param itemId
	 * @param skuId
	 * @return
	 */
	List<InventoryArea> queryInventoryAreaByWarehouse(@Param("warehouseId") Long warehouseId,
			@Param("itemId") Long itemId, @Param("skuId") Long skuId);

	Integer queryInventoryAreaCount(InventoryQueryVO inventoryQueryVO);

	List<InventoryArea> queryInventoryAreas(InventoryQueryVO inventoryQueryVO);
	
	/**
	 * 
	 * @param id 主键
	 * @param toTrans 在途入仓的数量
	 * @param lockedTransInv 入仓时的在途锁定数量，用来防止并发数据过期
	 * @return
	 */
	int updateTransToInventoryArea(@Param("id")Long id , @Param("toTrans")int toTrans, @Param("lockedTransToInv")int lockedTransToInv,  @Param("lockedTransInv")int lockedTransInv);

	/**
	 * 减库存盘点
	 * 
	 * @param id
	 * @param inventory
	 * @param toCheck
	 * @return
	 */
	int updateInventoryAreaCheck(@Param("id")Long id , @Param("inventory")int inventory, @Param("toCheck")int toCheck);
	
	/**
	 * 减在途盘点
	 * 
	 * @param id
	 * @param transInv
	 * @param toCheck
	 * @return
	 */
	int updateInventoryAreaTransCheck(@Param("id")Long id , @Param("transInv")int transInv, @Param("toCheck")int toCheck);
	
	/**
	 * 增加实际库存
	 * 
	 * @param id
	 * @param inventory
	 * @param toAdd
	 * @return
	 */
	int updateInventoryAreaAddInventory(@Param("id")Long id , @Param("inventory")int inventory, @Param("toAdd")int toAdd);
	
	void updateUpcForInventoryArea(ErpOrder erpOrder);
	
	List<InventoryArea> queryInventoryAreaForExcel(InventoryQueryVO inventoryQueryVO);
	
	
	List<InventoryArea> queryInventoryAreasList();
}
